package com.tedu.api.io;

import org.testng.annotations.Test;

import java.io.*;

/**
 * 标准流：IO流异常处理对象
 *
 * 高级流：BufferedOutputStream 缓冲输出流    写    bos.txt
 *       BufferedInputStream 缓冲输入流    读入
 */

public class IOSAPI {
    /**
     * 缓冲输入流：构造器--->异常对象：具备功能：合理传输数据  效率提高
     * 字符流【转换流】---解决：缓冲输入流读取单位  为字节问题
     * Input Stream Reader   读取单位：字符
     * Input Stream Reader   写出单位：字符
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size)
     * 问题1：不能指定字符集
     * 问题2：不能按照字符读取
     */
    @Test
    public void testBIS() {
        /**
         * 针对缓冲输出/入功能上的限定---传输：文本
         * 字符流【转换流】---解决：缓冲输入流读取单位  为字节问题
         * InputStreamReader     读取单位：字符
         * OutputStreamReader   写出单位：字符  调用字符串getBygets 写出文本
         * 需求：重新写流---针对：文字  写出文本：osw.txt
         *
         */
        //标准流：1.制空流
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        //标准流：2.捕获异常
        //创建低级流
        try {
            fos = new FileOutputStream("osw.txt");
            //不考虑效率---只传输文本---字符输出流：输出单位字符形式
            //字符流都可以在构造器第二个参数指定编码集
            osw = new OutputStreamWriter(fos, "UTF8");
            //write()   直接写出文本【不要将文本转换为字节数组】
            osw.write("老铁双击！");
            osw.write("666\n");//换行 字符char
            osw.write("999");
        } catch (FileNotFoundException e) {//文件不存在
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {//字符集转换
            e.printStackTrace();
        } catch (IOException e) {//IO流异常：所有传输失败总异常
            e.printStackTrace();
        } finally {
            //关闭高级流：字符输出流
            if (osw != null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

//    @Test
//    public void testBIS(){
//        //创建低级流
//        FileInputStream fis=
//                new FileInputStream("bos.txt");
//        //创建高级流------指定字符集------缓冲不具备功能-----新转换流
//        BufferedInputStream bos=
//                new BufferedInputStream(fis);
//        /**
//         * rea
    @Test
    public void testOSW(){

    }

    /**
     * 高级流处理流字符流，特点：套在低级流上，呗其他高级流上床书单位字符
     * 字符驶入六
     * 字符输出流
     * InputStreamReader    字符输入流
     *
     * 需求：ISR字符输入流读取 osw.txt  文件？？
     * 当前代码转换为标准流IO：捕获所有异常
     * 读取每行文本  readLine（）   提示;：不为null代表文本写出
     * 写出：给老铁来个双击666    参考：cv
     *
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis=new FileInputStream("osw.txt");
        //创建高级流--转换流---字符输入流
        InputStreamReader isr=new InputStreamReader(fis);
        //读 read    问题：读的是字节而不是字符
           //方法：
        //创建高级流--针对转换流中字符输入流无法读取形式字符的情况--缓冲字符输入流
        BufferedReader br=new BufferedReader(isr);
        /**
         * Bufferedreader类
         * readline（）读入若干字符串，直到读到1换行符为止
         */
String Line=br.readLine();
        System.out.println(""+Line);
    }
    /**
     * 作业2：读取IOSAPI。java文件--所有代码--写出控制台
     */
    @Test
    public void testHomeWork2() throws FileNotFoundException {
        FileInputStream fis=null;
        //高级流---字符输入流
        InputStreamReader isr=null;
        //缓冲输入流
        BufferedReader br = null;
        try {
            fis = new FileInputStream("src" + File.separator +

                       "main" + File.separator +
                    "java" + File.separator +
                       "com" + File.separator +
                      "tedu" + File.separator +
                    "api" + File.separator +
                    "io" + File.separator + "iosapi.java");
                 isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);

                 String len =null;
            while ((len = br.readLine()) != null) {
                System.out.println("打印IOSAPI所有内容：" + len);
            }

           } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {

                    e.printStackTrace();

                }
            if(isr!=null)

                try {
                    isr.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }
        }

    }



    /**
     * BufferedWrite--低配版本输出流【缓冲输出流】
     *
     * printwrint--高配版本输出流【字符输出流】
     * 高级流不能直接创建--直接创建【不需要穿关键低级流】封装
     * 封装内存所有流的特点
     * 需求：写出文件pw.txt--文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("");
        //高级流：转换流，功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //
        //穿键高级流：低级流：输出流+转换流+缓冲流
        BufferedWriter bw=new BufferedWriter(osw);
        PrintWriter pw=new PrintWriter( bw);
        //写出功能：print（）打印一行文本不换行
        //       println（）换行
        pw.print("你就是");
        pw.println("我的小可爱");
        pw.close();
        //关闭高级流--缓冲字符流：【缓冲区】关闭流--调用flush
        //针对传输文本
    }
}




























